package dhy.com.handler;

import dhy.com.message.RpcResponseMessage;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.concurrent.Promise;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <p>
 *     接收响应回来的消息的出站处理器,只处理RpcResponseMessage类型的消息
 * </p>
 * @author zdh
 */
@Slf4j
@ChannelHandler.Sharable
public class RpcResponseMessageHandler extends SimpleChannelInboundHandler<RpcResponseMessage> {

    /**
     * 序号(每个Message对象都有的唯一标识)  用来接收结果的 promise 对象
     */
    public static final Map<Integer, Promise<Object>> PROMISES = new ConcurrentHashMap<>();

    /**
     * <P>
     *     如果有消息可以读取,会触发该方法
     * </P>
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, RpcResponseMessage msg) throws Exception {
        log.debug("接收到响应回来的消息,消息具体信息如下: {}", msg);
        //处理完一个promise对象后,要移除
        Promise<Object> promise = PROMISES.remove(msg.getSequenceId());
        if (promise != null) {
            //获取消息的返回值
            Object returnValue = msg.getReturnValue();
            //获取消息的异常信息
            Exception exceptionValue = msg.getExceptionValue();
            if(exceptionValue != null) {
                //出现了异常
                promise.setFailure(exceptionValue);
            } else {
                //正常返回
                promise.setSuccess(returnValue);
            }
        }
    }
}
